

local symbols        = require 'symbol.unit'
local slk            = require 'jass.slk'
local unit_data     = {}
local unit_list = {}

ac.wait(100,function()
    for i,v in ipairs(load_excel('技能数据.xlsx','英雄参数')) do
        local k = v.name
        local data = ac.lni('unit',k) or {}
        local id = symbols[k]
        local da = slk.unit[id]
        for key,name in pairs(v) do
            data[key] = get_hero_skill_data(name)
        end
        
        if da then
            data.art = da.art
        else
            print('没有物编',k)
        end
        data.state = {
            ['攻击间隔'] = 1.2,
            ['攻击距离'] = 600,
            ['基础攻击'] = 100,
            ['攻击速度'] = 100,
            ['魔法恢复'] = 10,
            ['魔法上限'] = 100,
            ['生命上限'] = 1000,
            ['攻击成长'] = 5,
            ['生命成长'] = 50,
            ['每秒木材'] = 1,
            ['每秒金币'] = 1,
        }
        data.types = {'英雄'}
        data.name = k
        data['UI大小'] = v['UI大小']
        data['隐藏'] = v['隐藏']

        ac.lni('unit',k,data)

        if k~='通用英雄' then
            unit_data[k] = v
            table.insert(unit_list,data)
        end
    end
end)

--测试数据注册
ac.wait(1000,function()
    local test_data = table.copy(unit_list)
    ac.game:notify('测试-注册数据','更换英雄',test_data,function(_,player,name)
        local data = ac.lni('unit',name)
        player:notify('玩家-更换英雄',player,name)
        --player:notify('玩家-显示更换英雄',player,{data})
        
    end)
end)

--
ac.game:event '玩家-更换英雄'(function(_,player,name)
    local point = point or player.point1
    local hero = player.hero
    local init = hero==nil
    local lock = player:get_data('不会获取英雄') or {}
    lock[name] = true
    player:set_data('不会获取英雄',lock)
    if init then
        
        hero = player:create_unit(name,point)
        hero.max_level = 10
        --player:create_unit('深渊触手',point)
        hero:add_skill('急速冲刺','英雄',7)
        --hero:add_skill('钩子','英雄',9)
        --hero:add_skill('宠物设定')
        player:add('金币',1000)
        player:add('木材',100)
        player.hero = hero
        unit_add_life(hero)
        player:notify('玩家-选择英雄完毕',player,hero)
        hero:notify('英雄-加载存档数据',hero)
        hero:event '单位-死亡'(function(trg)
                player:notify('玩家-复活英雄',player,hero)
            -- if hero:get('复活次数')>0 then
            --     hero:add('复活次数',-1)
            --     player:notify('玩家-复活英雄',player,hero)
            --     player:send_msg(('英雄死亡，剩余|cff00ff00复活次数|r:%0.f'):format(hero:get('复活次数')))
            -- else
            --     player:send_msg('|cffff0000英雄彻底死亡了|r')
            -- end
        end)
    else
        if hero.fh_timer then
            hero.fh_timer:on_timer()
        end
        local ex = hero:get('攻击距离') - hero:get_slk('rangeN1')
        hero:transformat(name)
        local range2 = hero:get_slk('rangeN1') + ex
        hero:set('攻击距离',range2)
        hero:notify('单位-更换英雄',hero)
        --额外增加属性
        hero:add('基础攻击',200)
        hero:add('生命上限',1000)
        hero:set_data('进化次数',hero:get_data('进化次数',0) + 1)
        player:send_msg('|cffffff00英雄进化！攻击力+200，生命值+1000|r')
        hero.max_level = hero.max_level + 10
    end
    
    local abi = hero:get_data('保留技能')
    hero:set_data('保留技能',nil)

    local data = unit_data[name]
    local new = {}
    for a=1,2 do
        local key = ('技能%s'):format(a)
        local name = data and data[key]
        if name then
            local skill = hero:add_skill(name,'英雄')
            if a==2 then
                hero:set_data('保留技能',name)
            end
        end
    end
    
    if abi and hero:get_data('进化次数',0)<=5 then
        local skill = hero:add_skill(abi,'英雄')
        skill.permanent = true
    end
    
    player:set_camera(hero:get_point())
    player:select_unit(hero)
    
end)



ac.game:event '玩家-开始更换英雄'(function(_,player)
    local hero = player.hero
    local lock = player:get_data('不会获取英雄') or {}
    local weight = {}
    local count = 2
    for a,data in ipairs(unit_list) do
        if lock[data.name]==nil and (hero==nil or data.name~=hero.name) then
            if data['隐藏'] then
                table.insert(weight,{data,1})
            else
                table.insert(weight,{data,10})
            end
        end
    end
    local data = {}
    for a=1,count do
        local da,index = table.get_by_weight(weight)
        data[a] = da
        table.remove(weight,index)
    end
    player:notify('玩家-显示更换英雄',player,data)
end)

--确定保留技能后开始更换英雄
-- ac.game:event '玩家-确定保留技能'(function(_,player,temp)
--     if player:get_data('能进化') then
--         local hero = player.hero
--         player:set_data('能进化',false)
--         hero:set_data('保留技能',temp and temp.name)
--         if hero then
--             if hero:get_data('保留技能次数',0)<4 then
--                 local lock = player:get_data('不会获取英雄') or {}
--                 lock[hero.name] = true
--                 player:set_data('不会获取英雄',lock)

--                 hero:set_data('保留技能次数',hero:get_data('保留技能次数',0) + 1)
--                 player:notify('玩家-开始更换英雄',player)
--             end
--         end

--     end
-- end)


--准备更换英雄,询问是否保留技能
ac.game:event '玩家-准备更换英雄'(function(_,player)
    local hero = player.hero
    -- if hero and hero.name~='通用英雄' then
    --     player:notify('玩家-选择保留技能',player,hero.has_skill)
    -- else
    --     player:set_data('能进化',false)
    --     player:notify('玩家-开始更换英雄',player)
    -- end
    player:set_data('能进化',false)
    player:notify('玩家-开始更换英雄',player)
end)

ac.sync:event '玩家-准备更换英雄'(function(_,player)
    player:notify('玩家-准备更换英雄',player)
end)


local select_rect = ac.rect.j_rect('base')
ac.game:event '游戏-设置难度'(function(_,hard,class)
    local trgs = {}
    ac.wait(10,function()
        ac.each_player(function(player)
            local time = 0
            player:set_camera(select_rect:get_point())
            player:notify('玩家-更换英雄',player,'通用英雄')
        end)
    end)
    
    if package.local_test then
        local point = ac.point(0,0)
        -- for a=1,9 do
        --     local point = point - {math.random(100),math.random(600)}
        --     local unit = ac.player[12]:create_unit('hfoo',point)
        --     unit:add_restriction '免死'
        --     unit:add_restriction '定身'

        -- end
    end
end)


ac.game:event '单位-英雄升级'(function(_,hero)
    if hero.level==hero.max_level and hero.level<100 then
        local player = hero.owner
        player:set_data('能进化',true)
    end
    
    hero:set_data('攻击成长',hero:get_data('攻击成长',0) + hero:get('攻击成长'))
    hero:set_data('生命成长',hero:get_data('生命成长',0) + hero:get('生命成长'))
    hero:set_data('护甲成长',hero:get_data('护甲成长',0) + hero:get('护甲成长'))
    hero:set_data('力量成长',hero:get_data('力量成长',0) + hero:get('力量成长'))
    hero:set_data('敏捷成长',hero:get_data('敏捷成长',0) + hero:get('敏捷成长'))
    hero:set_data('智力成长',hero:get_data('智力成长',0) + hero:get('智力成长'))
    hero:add('基础攻击',hero:get('攻击成长'))
    hero:add('生命上限',hero:get('生命成长'))
    hero:add('基础护甲',hero:get('护甲成长'))
    hero:add('基础力量',hero:get('力量成长'))
    hero:add('基础敏捷',hero:get('敏捷成长'))
    hero:add('基础智力',hero:get('智力成长'))
end)


ac.game:event '单位-成长补正'(function(_,hero)
    local ex1 = hero:get('攻击成长')*(hero.level - 1) - hero:get_data('攻击成长',0)
    local ex2 = hero:get('生命成长')*(hero.level - 1) - hero:get_data('生命成长',0)
    local ex3 = hero:get('护甲成长')*(hero.level - 1) - hero:get_data('护甲成长',0)
    local ex4 = hero:get('力量成长')*(hero.level - 1) - hero:get_data('力量成长',0)
    local ex5 = hero:get('敏捷成长')*(hero.level - 1) - hero:get_data('敏捷成长',0)
    local ex6 = hero:get('智力成长')*(hero.level - 1) - hero:get_data('智力成长',0)
    
    hero:set_data('攻击成长',hero:get_data('攻击成长',0) + ex1)
    hero:set_data('生命成长',hero:get_data('生命成长',0) + ex2)
    hero:set_data('护甲成长',hero:get_data('护甲成长',0) + ex3)
    hero:set_data('力量成长',hero:get_data('力量成长',0) + ex4)
    hero:set_data('敏捷成长',hero:get_data('敏捷成长',0) + ex5)
    hero:set_data('智力成长',hero:get_data('智力成长',0) + ex6)
    hero:add('基础攻击',ex1)
    hero:add('生命上限',ex2)
    hero:add('基础护甲',ex3)
    hero:add('基础力量',ex4)
    hero:add('基础敏捷',ex5)
    hero:add('基础智力',ex6)
end)